package com.java.basis.io.stream.inputoroutstream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author wangning
 * @create 2021-06-11 11:44
 * 单字节读取
 */
public class Test01 {
	/**
	 * 当文件是 GBK 中文字符占2个字节，非中文占一个字节，UTF-8 中文字符占用3个字节
	 * <p>
	 * 例如："abc中国"
	 * <p>
	 * 当我们以读到'中'时，由于是字节流读取数据，这时候就会读到'中'的一半，此时就会产生乱码。
	 *
	 * @param args 参数
	 * @throws IOException IO异常
	 */
	public static void main(String[] args) throws IOException {
		FileInputStream in = null;
		try {
			in = new FileInputStream("F:/jt/file/testinputstream.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		//单字节循环读取，标准格式
		int b;
		while ((b = in.read()) != -1) {
			char c = (char) b;
			System.out.print(c);
		}
		in.close();

	}
}

/**
 * 解决方法:
 *
 * 当我们从文件中读取一个字节的时候，判断这个字节是否是中文的（判断这个字符是否是标准ASCII表中的，如果不是，
 * 则当前读取的字节为中文，则继续读取下一个字节，因为中文占两/三个字节）。
 */
class Test0101 {
	public static void main(String[] args) throws IOException {
		FileInputStream in = null;
		try {
			in = new FileInputStream("F:/jt/file/testinputstream.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		//单字节循环读取，标准格式，GBK为两个字节，UTF-8为三个字节
		int b;
		int b1;
		int b2;

		while ((b = in.read()) != -1) {
			if (!(b >= 0 && b < 128)) {
				b1 = in.read();
				b2 = in.read();
				System.out.println(b);
				System.out.println(b1);
				System.out.println(b2);

				System.out.print(new String(new byte[]{(byte) b, (byte) b1, (byte) b2}));
				continue;
			}
			char c = (char) b;
			System.out.print(c);
		}
		in.close();

	}
}

